import { resolve } from 'path';
import autoprefixer from 'autoprefixer'
import { defineConfig, loadEnv } from 'vite'
import viteCompression from 'vite-plugin-compression'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite';
import postCssPxToRem from "postcss-pxtorem";
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import vue from '@vitejs/plugin-vue'
import { terser } from 'rollup-plugin-terser'


//  转rem
const px2remOptions = {
  rootValue: 100, // 转换比例
  // exclude: /(node_module)/, //默认false，可以（reg）利用正则表达式排除某些文件夹的方法，例如/(node_module|src)/
  propList: ["*"], //是一个存储哪些将被转换的属性列表，这里设置为["*"]全部，假设需要仅对边框进行设置，可以写]['*','!border*']
  //selectorBlackList :['.box'],//，那例如fs-xl类名，里面有关px的样式将不被转换，这里也支持正则写法。 
  replace: true, //替换包含rems的规则。
  mediaQuery: false, //（布尔值）允许在媒体查询中转换px。
  minPixelValue: 0, //设置要替换的最小像素值(3px会被转rem)。 默认 0
}

const __ModuleLibs = [
  /src\/module\/([^\/]*?)\//,
  /src\/module-vendor\/([^\/]*?)\//,
  /src\/suite\/.*\/modules\/([^\/]*?)\//,
  /src\/suite-vendor\/.*\/modules\/([^\/]*?)\//,
];

function customManualChunk(id) {
  for (const moduleLib of __ModuleLibs) {
    const matched = id.match(moduleLib);
    if (matched) return matched[1];
  }
  return null;
}

// https://vitejs.dev/config/
export default defineConfig(({ mode }: any): any => {
  //  解决 vite.config.ts中无法使用import.meta.env 的情况
  const VITE_APP_PROXY_URL: string = loadEnv(mode, process.cwd()).VITE_APP_PROXY_URL;
  const VITE_APP_VISTOR_URL: string = loadEnv(mode, process.cwd()).VITE_APP_VISTOR_URL;

  return {
    base: './',
    plugins: [
      vue(),
      AutoImport({
        resolvers: [ElementPlusResolver()],
      }),
      Components({
        resolvers: [ElementPlusResolver()],
      }),
      viteCompression({
        verbose: true,
        disable: false,
        threshold: 10240,
        algorithm: 'gzip',
        ext: '.gz',
        deleteOriginFile: false, // 压缩后不删除原文件
      }),
    ],
    resolve: {
      // 配置路径别名
      alias: {
        "@": resolve(__dirname, "src"),
        extensions: ['.js', '.ts', '.json', '.vue']
      },
    },
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: `@use "@/style/global.scss" as *;`
        }
      },
      postcss: {
        plugins: [
          postCssPxToRem(px2remOptions),
          autoprefixer({ // 自动添加前缀
            overrideBrowserslist: [
              "Android 4.1",
              "iOS 7.1",
              "Chrome > 31",
              "ff > 31",
              "ie >= 8"
              //'last 2 versions', // 所有主流浏览器最近2个版本
            ],
            grid: true
          })
        ]
      }
    },
    // 配置后才能让编译后的vue路径被正确识别
    manifest: true,
    build: {
      cssCodeSplit: true, // css 代码分割
      chunkSizeWarningLimit: 2048, // 单个 css 文件超过 2048 字节时会显示警告
      minify: 'terser', // 使用 Terser 进行压缩
      terserOptions: {
        // minify 为terser生效 若minify为esbuild 则需要走esbuild的配置
        compress: {
          drop_console: mode === "production", // 生产环境去除console
          drop_debugger: mode === "production", // 生产环境去除debugger
        },
      },
      rollupOptions: {
        // rollup 打包配置
        output: {
          // 静态资源打包区分文件夹
          chunkFileNames: "static/js/[name]-[hash].js",
          entryFileNames: "static/js/[name]-[hash].js",
          assetFileNames: "static/[ext]/[name]-[hash].[ext]",
          manualChunks: (id) => {
            return customManualChunk(id);
          },
        },
      },
    },
    server: {
      host: "0.0.0.0",
      port: 8999,
      // 是否开启 https
      https: false,
      // 服务启动时是否自动打开浏览器
      open: true,
      // 允许跨域
      cors: true,
      //  热更新
      // hmr: true,
      // 设置反向代理，跨域
      proxy: {
        "/api": {
          // 后台地址
          target: VITE_APP_PROXY_URL,
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/api/, ""),
        },
        // "/prod-api": {
        //   // 后台地址
        //   target: VITE_APP_VISTOR_URL,
        //   changeOrigin: true,
        //   rewrite: (path) => path,
        // },
        "/vistor": {
          // 后台地址
          target: VITE_APP_VISTOR_URL,
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/vistor/, "/prod-api"),
        },
      },
    }
  }
});


